package com.bw.aop;

import com.alibaba.fastjson.JSON;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.*;
import org.springframework.stereotype.Component;

//@Component  // 把这个类 对象放入容器
//@Aspect // 开启织面
public class Myaop {
    /**
     * 前置通知
     * @param joinPoint
     * 切入点表达式（匹配方法名 用来 切入方法的 ）
     */
    @Before("execution( * com.bw.service.*.*(..))")
    public void before(JoinPoint joinPoint){
        String name = joinPoint.getSignature().getName(); // 获取原方法的 方法名
        Object[] args = joinPoint.getArgs(); // 获取原方法的 入参
        System.out.println(name + "入参是："  + JSON.toJSONString(args));
    }

    /**
     * 后置通知
     * @param joinPoint
     * @param result
     */
    @AfterReturning(returning = "result", pointcut = "execution( * com.bw.service.*.*(..))")
    public void  afterRetuning(JoinPoint joinPoint,Object result){
        String name = joinPoint.getSignature().getName();
        System.out.println(name + "返参是：" + JSON.toJSONString(result));
    }
    //异常抛出增强
    @AfterThrowing("execution( * com.bw.service.*.*(..))")
    public void afterThrow() {
        System.out.println("----@AfterThrowing 异常时执行------");
    }
    //final增强，不管是抛出异常或者正常退出都会执行
    @After("execution( * com.bw.service.*.*(..))")
    public void afterFinal() {
        System.out.println("----@After 最后一定会执行------");
    }

}
